/**
 * 发生消息给用户接口
 */

//引入Q模块
var Q = require('q');
//引入公共函数
var util = require('../../util');

//sendMsg入口函数
var index = function(getData, postData, config, redis, db) {
	var deferred = Q.defer();
	console.log(postData);
	//判断是否存在用户ID和回复用户的消息内容
	if(postData && postData.userId && postData.msg && postData.accessToken) {
		//执行发送消息函数
		sendMsg(postData.userId, postData.msg, postData.accessToken, config).then(function(data) {
			console.log(data.errcode);
			//发送后获得的错误码解析
			switch(data.errcode) {
				case 0:
					db.insert('chatListLogs', {
						sender: 'service',
						userId: postData.serviceInfo.serviceId,
						userName: postData.serviceInfo.serviceName,
						msg: postData.msg,
						timestamp: Date.now()
					}).then(function() {
						console.log('存储服务员发送的消息成功');
						deferred.resolve(['broadcast', {
							storeId: postData.storeId,
							type: 'user',
							event: 'replyMsg',
							data: {
								userId: postData.userId,
								msg: postData.msg
							}
						}]);
					}, function() {
						console.log('存储服务员发送的消息失败', {
							sender: 'service',
							userId: postData.serviceInfo.serviceId,
							userName: postData.serviceInfo.serviceName,
							msg: postData.msg,
							timestamp: Date.now()
						});
						deferred.resolve(['broadcast', {
							storeId: postData.storeId,
							type: 'user',
							event: 'replyMsg',
							data: {
								userId: postData.userId,
								msg: postData.msg
							}
						}]);
					});
				break;
				case -1:
					//微信服务器繁忙无法回复用户消息
					deferred.reject('-0050');
				break;
				case 40002: 
					//非法的凭证类型
					deferred.reject('-0052');
				break;
				case 40003:
					//openId不合法
					deferred.reject('-0053');
				break;
				case 45015:
					//回复消息时间超过限制
					deferred.reject('-0054');
				break;
				case 45047: 
					//回复消息额度不足
					deferred.reject('-0055');
				break;
				case 48001:
					//API功能未授权，小程序可能未获得此接口
					deferred.reject('-0056');
				break;
				case 40001: 
					try {
						console.log('accessToken因特殊原因失效，重新获取');
						//发送GET请求到微信服务器取得accessToken数据
						util.get('https://api.weixin.qq.com/cgi-bin/token', {
							//小程序APPID
							appid: config.clientAppId,
							//小程序密钥APPSECRET
							secret: config.clientAppSecret,
							//指定请求类型
							grant_type: 'client_credential'
						}).then(function(jsonData) {
							//判断是否存在accessToken和accessToken有效期
							return util.isSet(jsonData.access_token, jsonData.expires_in);
						}, function() {
							//从微信服务器获取accessToken失败
							deferred.reject('-0016');
						}).then(function(jsonData) {
							//集合有效数据，jsonData来自isSet函数返回的参数列表
							let accessTokenData = {
								//accessToken值
								accessToken: jsonData[0],
								//得到当前时间戳（秒）
								timestamp: parseInt(Date.now() / 1000),
								//accessToken有效期
								expire: jsonData[1]
							};
							//存储accessToken到redis
							redis.set('accessToken', JSON.stringify(accessTokenData)).then(function() {
								//设置accessToken的生命周期（有效期，秒）
								return redis.expire('accessToken', accessTokenData.expire);
							}, function() {
								//存储accessToken到redis失败
								deferred.reject('-0023');
							}).then(function() {
								//存储accessToken成功，使用新的accessToken发送消息
								util.post('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' + accessTokenData.accessToken, 'POST', {
									//发送给用户的用户openId
									touser: postData.userId,
									//消息类型
									msgtype: 'text',
									//消息内容
									text: {
										content: content
									}
								}).then(function(data) {
									console.log('发送消息成功',data);
									//消息发送成功
									deferred.resolve(data);
								}, function(err) {
									deferred.reject('-0041');
								});
							}, function() {
								//设置accessToken的生命周期失败
								deferred.reject('-0024');
							});
						}, function() {
							//从微信服务器获取的json数据中未找到accessToken
							deferred.reject('-0018');
						});
					}
					catch(e) {
						//回复消息时accessToken不正确
						deferred.reject('-0051');
					}
			}
		}, function(errCode) {
			//发送消息失败
			deferred.reject(errCode);
		});
	}
	else {
		//服务员回复用户消息失败，参数不足
		deferred.reject('-0049');
	}
	return deferred.promise;
}

var sendMsg = function(userId, content, accessToken, config) {
	var deferred = Q.defer();
	//发送消息的POST请求函数
	util.post('https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' + accessToken, 'POST', {
		touser: userId,
		msgtype: 'text',
		text: {
			content: content
		}
	}).then(function(data) {
		console.log('发送请求成功',data);
		//消息发送成功
		deferred.resolve(data);
	}, function(err) {
		console.log(err);
		deferred.reject('-0041');
	});
	return deferred.promise;
}

//暴露接口
module.exports = {
	index: index
};